﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Teal.Compiler {

    ///// <summary>
    ///// 表示成员修饰符的枚举。
    ///// </summary>
    //[Flags]
    //public enum Modifiers {

    //    /// <summary>
    //    /// 无修饰符。
    //    /// </summary>
    //    none = 0,

    //    /// <summary>
    //    /// 表示静态的成员。
    //    /// </summary>
    //    @static = 1 << 0,

    //    /// <summary>
    //    /// 表示常量成员。
    //    /// </summary>
    //    @const = 1 << 1,

    //    /// <summary>
    //    /// 表示最终的成员。标记当前类不可被继承、函数不可被重写、字段不可被改变。
    //    /// </summary>
    //    final = 1 << 2,

    //    /// <summary>
    //    /// 表示覆盖的成员。
    //    /// </summary>
    //    @new = 1 << 3,

    //    /// <summary>
    //    /// 表示抽象的成员。
    //    /// </summary>
    //    @abstract = 1 << 4,

    //    /// <summary>
    //    /// 表示虚成员。
    //    /// </summary>
    //    @virtual = 1 << 5,

    //    /// <summary>
    //    /// 表示重写的成员。
    //    /// </summary>
    //    @override = 1 << 6,

    //    /// <summary>
    //    /// 表示外部的成员。
    //    /// </summary>
    //    @extern = 1 << 7,

    //    /// <summary>
    //    /// 表示不定的成员。
    //    /// </summary>
    //    @volatile = 1 << 8,

    //    /// <summary>
    //    /// 表示公开的成员。
    //    /// </summary>
    //    @public = 1 << 9,

    //    /// <summary>
    //    /// 表示保护的成员。
    //    /// </summary>
    //    @protected = 1 << 10,

    //    /// <summary>
    //    /// 表示私有的成员。
    //    /// </summary>
    //    @private = 1 << 11,

    //    /// <summary>
    //    /// 表示访问修饰符。
    //    /// </summary>
    //    ACCESSIBILITY = @public | @protected | @private,

    //}

    /// <summary>
    /// 对 <see cref="Modifiers"/> 的扩展。
    /// </summary>
    public static class ModifiersExtensions2 {

        /// <summary>
        /// 获取修饰符中表示可访问性的部分。
        /// </summary>
        /// <param name="modifier"></param>
        /// <returns></returns>
        public static Modifiers getAccessibility(this Modifiers modifiers) {
            return modifiers & Modifiers.ACCESSIBILITY;
        }

        /// <summary>
        /// 获取修饰符中表示可访问性的部分。
        /// </summary>
        /// <param name="modifier"></param>
        /// <returns></returns>
        public static string getAcccessibilityReadableName(this Modifiers modifiers) {
            switch (modifiers.getAccessibility()) {
                case Modifiers.@private:
                    return "私有的";
                case Modifiers.@protected:
                    return "保护的";
                default:
                    return "公开的";
            }
        }

        public static bool hasFlag(this Modifiers modifiers, Modifiers flag) {
            return (modifiers & flag) != 0;
        }

        public static string getName(this Modifiers modifiers) {
            return modifiers.ToString();
        }

        public static string getNames(this Modifiers modifiers) {
            int modifiersValue = (int)(modifiers & Modifiers.TOP);
            int currentModifier = 1;
            StringBuilder sb = new StringBuilder();
            while (modifiersValue > 0) {
                if ((modifiersValue & 1) == 1) {
                    sb.Append(((Modifiers)currentModifier).getName());
                    sb.Append(' ');
                }
                modifiersValue >>= 1;
                currentModifier <<= 1;
            }
            if (sb.Length > 0) {
                sb.Length--;
            }
            return sb.ToString();
        }

    }

}
